/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import model.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import model.beans.Cliente;
import model.beans.Pedido;
import model.beans.Produto;
import model.beans.TipoProduto;

/**
 *
 * @author Juliane Chaerki
 */
public class PedidoDAO {
    private Connection con;
    private PreparedStatement stmtInserir;
    private PreparedStatement stmtAlterar;
    private PreparedStatement stmtListar;
    private PreparedStatement stmtBuscar;
    private PreparedStatement stmtCancelar;
    private PreparedStatement stmtConsulta;
    private PreparedStatement stmtEfetivar;
    private PreparedStatement stmtListaC;
    private PreparedStatement stmtBuscarD;
    private PreparedStatement stmtMontaL;
    private PreparedStatement stmtAtraso;
    private PreparedStatement stmtAberto;
    private PreparedStatement stmtAbertoHoje;
    
    

    public PedidoDAO() throws Exception {
        con = ConnectionFactory.getConnection();   
    }

    public PedidoDAO(Connection con) throws Exception {
        this.con = con;
    }

    public int inserir(Pedido pedido) throws Exception {
        stmtInserir = con.prepareStatement("INSERT INTO pedido(idProduto, idCliente, problema, dataEntrada, dataEntregaPrev, valor, situacao) VALUES(?,?,?,?,?,?,'A')");
        stmtInserir.setInt(1, pedido.getProduto().getIdProduto());
        stmtInserir.setInt(2, pedido.getCliente().getIdCliente());
        stmtInserir.setString(3, pedido.getProblema());
        stmtInserir.setDate(4, new java.sql.Date(pedido.getDataEntrada().getTime()));
        stmtInserir.setDate(5, new java.sql.Date(pedido.getDataEntregaPrev().getTime()));
        stmtInserir.setDouble(6, pedido.getValor());
                
        stmtInserir.executeUpdate();
        
        stmtConsulta = con.prepareStatement("SELECT MAX(idPedido) as id FROM pedido");
        ResultSet rs = stmtConsulta.executeQuery();
        rs.next();
        int id = rs.getInt("id");
        return id;
    }
    
    public void atualizar(Pedido pedido) throws Exception{
        stmtAlterar = con.prepareStatement("UPDATE pedido SET idProduto = ?, idCliente = ?, problema = ?, dataEntregaPrev = ?, valor = ? WHERE idPedido = ?");
        stmtAlterar.setInt(1, pedido.getProduto().getIdProduto());
        stmtAlterar.setInt(2, pedido.getCliente().getIdCliente());
        stmtAlterar.setString(3, pedido.getProblema());
        stmtAlterar.setDate(4, new java.sql.Date(pedido.getDataEntregaPrev().getTime()));
        stmtAlterar.setDouble(5, pedido.getValor());
        stmtAlterar.setInt(6, pedido.getIdPedido());
        
        stmtAlterar.executeUpdate();
     }
    
    public void cancelar(int id) throws Exception{
        stmtCancelar = con.prepareStatement("UPDATE pedido SET situacao = 'C' WHERE idPedido = ?");
        stmtCancelar.setInt(1, id);
        stmtCancelar.executeUpdate();        
    }
    
    public void efetivar(int id) throws Exception{
        stmtEfetivar = con.prepareStatement("UPDATE pedido SET situacao = 'F' WHERE idPedido = ?");
        stmtEfetivar.setInt(1, id);
        stmtEfetivar.executeUpdate();        
    }
    
    public List<Pedido> listarTodos() throws Exception {
       stmtListar = con.prepareStatement("SELECT idPedido, problema, dataEntrada, dataEntregaPrev, valor,\n" +
                                        "       pe.idProduto, pr.nome as produto, pr.modelo, pr.fabricante,\n" +
                                        "       pr.idTipo, tp.tipo,\n" +
                                        "       pe.idCliente, cl.nome as cliente,\n" +
                                        "       (dataEntregaPrev - Date(Now())) as dias\n" +
                                        "FROM pedido pe\n" +
                                        "inner join produto pr\n" +
                                        "on pe.idProduto = pr.idProduto\n" +
                                        "inner join tipoProduto tp\n" +
                                        "on pr.idTipo = tp.idTipo\n" +
                                        "inner join cliente cl\n" +
                                        "on pe.idCliente = cl.idCliente\n" +
                                        "WHERE pe.situacao = 'A'\n" +
                                        "ORDER BY dataEntregaPrev");
       ResultSet rs = stmtListar.executeQuery();
       List<Pedido> lista = new ArrayList();
       while(rs.next()){
          TipoProduto tipo = new TipoProduto();
          Produto produto = new Produto();
          Cliente cliente = new Cliente();
          Pedido pedido = new Pedido();
          
          tipo.setIdTipoProduto(rs.getInt("idTipo"));
          tipo.setTipo(rs.getString("tipo"));
          
          produto.setIdProduto(rs.getInt("idProduto"));
          produto.setNome(rs.getString("produto"));
          produto.setModelo(rs.getString("modelo"));
          produto.setFabricante(rs.getString("fabricante"));
          produto.setTipoProduto(tipo);
          
          cliente.setIdCliente(rs.getInt("idCliente"));
          cliente.setNome(rs.getString("cliente"));
          
          pedido.setIdPedido(rs.getInt("idPedido"));
          pedido.setProduto(produto);
          pedido.setCliente(cliente);
          pedido.setProblema(rs.getString("problema"));
          pedido.setDataEntrada(rs.getDate("dataEntrada"));
          pedido.setDataEntregaPrev(rs.getDate("dataEntregaPrev"));
          pedido.setValor(rs.getDouble("valor"));
          pedido.setDias(rs.getInt("dias"));
          
          lista.add(pedido);
       }
       return lista;
    }
    
    public List<Pedido> buscar(String strBusca) throws Exception {
       stmtBuscar = con.prepareStatement("SELECT idPedido, problema, dataEntrada, dataEntregaPrev, valor,\n" +
                                        "       pe.idProduto, pr.nome as produto, pr.modelo, pr.fabricante,\n" +
                                        "       pr.idTipo, tp.tipo,\n" +
                                        "       pe.idCliente, cl.nome as cliente\n" +
                                        "FROM pedido pe\n" +
                                        "inner join produto pr\n" +
                                        "on pe.idProduto = pr.idProduto\n" +
                                        "inner join tipoProduto tp\n" +
                                        "on pr.idTipo = tp.idTipo\n" +
                                        "inner join cliente cl\n" +
                                        "on pe.idCliente = cl.idCliente\n" +
                                        "WHERE pe.situacao = 'A'\n" +
                                        "   AND (cl.nome like ? or pr.nome like ? or cpf like ? or endereco like ? or pe.idPedido like ?) \n"+
                                        "ORDER BY dataEntregaPrev");
       String str = "%" + strBusca + "%";
       stmtBuscar.setString(1, str);
       stmtBuscar.setString(2, str);
       stmtBuscar.setString(3, str);
       stmtBuscar.setString(4, str);
       stmtBuscar.setString(5, str);
       ResultSet rs = stmtBuscar.executeQuery();
       List<Pedido> lista = new ArrayList();
       while(rs.next()){
          TipoProduto tipo = new TipoProduto();
          Produto produto = new Produto();
          Cliente cliente = new Cliente();
          Pedido pedido = new Pedido();
          
          tipo.setIdTipoProduto(rs.getInt("idTipo"));
          tipo.setTipo(rs.getString("tipo"));
          
          produto.setIdProduto(rs.getInt("idProduto"));
          produto.setNome(rs.getString("produto"));
          produto.setModelo(rs.getString("modelo"));
          produto.setFabricante(rs.getString("fabricante"));
          produto.setTipoProduto(tipo);
          
          cliente.setIdCliente(rs.getInt("idCliente"));
          cliente.setNome(rs.getString("cliente"));
          
          pedido.setIdPedido(rs.getInt("idPedido"));
          pedido.setProduto(produto);
          pedido.setCliente(cliente);
          pedido.setProblema(rs.getString("problema"));
          pedido.setDataEntrada(rs.getDate("dataEntrada"));
          pedido.setDataEntregaPrev(rs.getDate("dataEntregaPrev"));
          pedido.setValor(rs.getDouble("valor"));
          
          lista.add(pedido);
       }
       return lista;
    }
    
        public List<Pedido> buscarData(Date dataI, Date dataF) throws Exception {
       stmtBuscar = con.prepareStatement("SELECT idPedido, problema, dataEntrada, dataEntregaPrev, valor,\n" +
                                        "       pe.idProduto, pr.nome as produto, pr.modelo, pr.fabricante,\n" +
                                        "       pr.idTipo, tp.tipo,\n" +
                                        "       pe.idCliente, cl.nome as cliente\n" +
                                        "FROM pedido pe\n" +
                                        "inner join produto pr\n" +
                                        "on pe.idProduto = pr.idProduto\n" +
                                        "inner join tipoProduto tp\n" +
                                        "on pr.idTipo = tp.idTipo\n" +
                                        "inner join cliente cl\n" +
                                        "on pe.idCliente = cl.idCliente\n" +
                                        "WHERE pe.situacao = 'A'\n" +
                                        "   AND (pe.dataEntrada BETWEEN ? AND ?) \n"+
                                        "ORDER BY dataEntregaPrev");
       stmtBuscar.setDate(1, new java.sql.Date(dataI.getTime()));
       stmtBuscar.setDate(2, new java.sql.Date(dataF.getTime()));
       ResultSet rs = stmtBuscar.executeQuery();
       List<Pedido> lista = new ArrayList();
       while(rs.next()){
          TipoProduto tipo = new TipoProduto();
          Produto produto = new Produto();
          Cliente cliente = new Cliente();
          Pedido pedido = new Pedido();
          
          tipo.setIdTipoProduto(rs.getInt("idTipo"));
          tipo.setTipo(rs.getString("tipo"));
          
          produto.setIdProduto(rs.getInt("idProduto"));
          produto.setNome(rs.getString("produto"));
          produto.setModelo(rs.getString("modelo"));
          produto.setFabricante(rs.getString("fabricante"));
          produto.setTipoProduto(tipo);
          
          cliente.setIdCliente(rs.getInt("idCliente"));
          cliente.setNome(rs.getString("cliente"));
          
          pedido.setIdPedido(rs.getInt("idPedido"));
          pedido.setProduto(produto);
          pedido.setCliente(cliente);
          pedido.setProblema(rs.getString("problema"));
          pedido.setDataEntrada(rs.getDate("dataEntrada"));
          pedido.setDataEntregaPrev(rs.getDate("dataEntregaPrev"));
          pedido.setValor(rs.getDouble("valor"));
          
          lista.add(pedido);
       }
       return lista;
    }
        
    public Pedido buscarPorId(int idPedido) throws Exception {
       stmtBuscar = con.prepareStatement("SELECT idPedido, problema, dataEntrada, dataEntregaPrev, valor,\n" +
                                        "       pe.idProduto, pr.nome as produto, pr.modelo, pr.fabricante,\n" +
                                        "       pr.idTipo, tp.tipo,\n" +
                                        "       pe.idCliente, cl.nome as cliente\n" +
                                        "FROM pedido pe\n" +
                                        "inner join produto pr\n" +
                                        "on pe.idProduto = pr.idProduto\n" +
                                        "inner join tipoProduto tp\n" +
                                        "on pr.idTipo = tp.idTipo\n" +
                                        "inner join cliente cl\n" +
                                        "on pe.idCliente = cl.idCliente\n" +
                                        "WHERE pe.situacao = 'A'\n" +
                                        "   AND idPedido = ?\n"+
                                        "ORDER BY idPedido");
       stmtBuscar.setInt(1, idPedido);
       ResultSet rs = stmtBuscar.executeQuery();
       rs.next();
       
      TipoProduto tipo = new TipoProduto();
      Produto produto = new Produto();
      Cliente cliente = new Cliente();
      Pedido pedido = new Pedido();

      tipo.setIdTipoProduto(rs.getInt("idTipo"));
      tipo.setTipo(rs.getString("tipo"));

      produto.setIdProduto(rs.getInt("idProduto"));
      produto.setNome(rs.getString("produto"));
      produto.setModelo(rs.getString("modelo"));
      produto.setFabricante(rs.getString("fabricante"));
      produto.setTipoProduto(tipo);

      cliente.setIdCliente(rs.getInt("idCliente"));
      cliente.setNome(rs.getString("cliente"));

      pedido.setIdPedido(rs.getInt("idPedido"));
      pedido.setProduto(produto);
      pedido.setCliente(cliente);
      pedido.setProblema(rs.getString("problema"));
      pedido.setDataEntrada(rs.getDate("dataEntrada"));
      pedido.setDataEntregaPrev(rs.getDate("dataEntregaPrev"));
      pedido.setValor(rs.getDouble("valor"));

      return pedido;
    }
    
    public List<Integer> montaLista() throws Exception{
        List<Integer> lista = new ArrayList();
        
        //consertos em atraso
        stmtMontaL = con.prepareStatement("SELECT count(idPedido) as qtde FROM pedido WHERE situacao = 'A' AND Date(Now()) > dataEntregaPrev");
        ResultSet rs = stmtMontaL.executeQuery();
        rs.next();
        lista.add(rs.getInt("qtde"));
        
        //consertos em aberto
        stmtMontaL = con.prepareStatement("SELECT count(idPedido) as qtde FROM pedido WHERE situacao = 'A'");
        rs = stmtMontaL.executeQuery();
        rs.next();
        lista.add(rs.getInt("qtde"));
        
        //consertos abertos hoje
        stmtMontaL = con.prepareStatement("SELECT count(idPedido) as qtde FROM pedido WHERE situacao = 'A' AND dataEntrada = Date(Now())");
        rs = stmtMontaL.executeQuery();
        rs.next();
        lista.add(rs.getInt("qtde"));

        //consertos efetivados hoje
        stmtMontaL = con.prepareStatement("SELECT count(idConserto) as qtde FROM conserto WHERE dataEntrega = Date(Now())");
        rs = stmtMontaL.executeQuery();
        rs.next();
        lista.add(rs.getInt("qtde"));
        
        return lista;
        
    }

     public List<Pedido> listarAtraso() throws Exception {
       stmtAtraso = con.prepareStatement("SELECT idPedido, problema, dataEntrada, dataEntregaPrev, valor,\n" +
                                        "       pe.idProduto, pr.nome as produto, pr.modelo, pr.fabricante,\n" +
                                        "       pr.idTipo, tp.tipo,\n" +
                                        "       pe.idCliente, cl.nome as cliente,\n" +
                                        "       (dataEntregaPrev - Date(Now())) as dias\n" +
                                        "FROM pedido pe\n" +
                                        "inner join produto pr\n" +
                                        "on pe.idProduto = pr.idProduto\n" +
                                        "inner join tipoProduto tp\n" +
                                        "on pr.idTipo = tp.idTipo\n" +
                                        "inner join cliente cl\n" +
                                        "on pe.idCliente = cl.idCliente\n" +
                                        "WHERE pe.situacao = 'A' AND Date(Now()) > dataEntregaPrev\n" +
                                        "ORDER BY dataEntregaPrev");
       ResultSet rs = stmtAtraso.executeQuery();
       List<Pedido> lista = new ArrayList();
       while(rs.next()){
          TipoProduto tipo = new TipoProduto();
          Produto produto = new Produto();
          Cliente cliente = new Cliente();
          Pedido pedido = new Pedido();
          
          tipo.setIdTipoProduto(rs.getInt("idTipo"));
          tipo.setTipo(rs.getString("tipo"));
          
          produto.setIdProduto(rs.getInt("idProduto"));
          produto.setNome(rs.getString("produto"));
          produto.setModelo(rs.getString("modelo"));
          produto.setFabricante(rs.getString("fabricante"));
          produto.setTipoProduto(tipo);
          
          cliente.setIdCliente(rs.getInt("idCliente"));
          cliente.setNome(rs.getString("cliente"));
          
          pedido.setIdPedido(rs.getInt("idPedido"));
          pedido.setProduto(produto);
          pedido.setCliente(cliente);
          pedido.setProblema(rs.getString("problema"));
          pedido.setDataEntrada(rs.getDate("dataEntrada"));
          pedido.setDataEntregaPrev(rs.getDate("dataEntregaPrev"));
          pedido.setValor(rs.getDouble("valor"));
          pedido.setDias(rs.getInt("dias"));
          
          lista.add(pedido);
       }
       return lista;
    }
     
     
    public List<Pedido> listarAbertoHoje() throws Exception {
       stmtAbertoHoje = con.prepareStatement("SELECT idPedido, problema, dataEntrada, dataEntregaPrev, valor,\n" +
                                        "       pe.idProduto, pr.nome as produto, pr.modelo, pr.fabricante,\n" +
                                        "       pr.idTipo, tp.tipo,\n" +
                                        "       pe.idCliente, cl.nome as cliente,\n" +
                                        "       (dataEntregaPrev - Date(Now())) as dias\n" +
                                        "FROM pedido pe\n" +
                                        "inner join produto pr\n" +
                                        "on pe.idProduto = pr.idProduto\n" +
                                        "inner join tipoProduto tp\n" +
                                        "on pr.idTipo = tp.idTipo\n" +
                                        "inner join cliente cl\n" +
                                        "on pe.idCliente = cl.idCliente\n" +
                                        "WHERE pe.situacao = 'A' AND dataEntrada = Date(Now())\n" +
                                        "ORDER BY dataEntregaPrev");
       ResultSet rs = stmtAbertoHoje.executeQuery();
       List<Pedido> lista = new ArrayList();
       while(rs.next()){
          TipoProduto tipo = new TipoProduto();
          Produto produto = new Produto();
          Cliente cliente = new Cliente();
          Pedido pedido = new Pedido();
          
          tipo.setIdTipoProduto(rs.getInt("idTipo"));
          tipo.setTipo(rs.getString("tipo"));
          
          produto.setIdProduto(rs.getInt("idProduto"));
          produto.setNome(rs.getString("produto"));
          produto.setModelo(rs.getString("modelo"));
          produto.setFabricante(rs.getString("fabricante"));
          produto.setTipoProduto(tipo);
          
          cliente.setIdCliente(rs.getInt("idCliente"));
          cliente.setNome(rs.getString("cliente"));
          
          pedido.setIdPedido(rs.getInt("idPedido"));
          pedido.setProduto(produto);
          pedido.setCliente(cliente);
          pedido.setProblema(rs.getString("problema"));
          pedido.setDataEntrada(rs.getDate("dataEntrada"));
          pedido.setDataEntregaPrev(rs.getDate("dataEntregaPrev"));
          pedido.setValor(rs.getDouble("valor"));
          pedido.setDias(rs.getInt("dias"));
          
          lista.add(pedido);
       }
       return lista;
    }     
//    public List<Pedido> listaCombo() throws Exception{
//        stmtListaC = con.prepareStatement("SELECT idPedido FROM pedido WHERE situacao = 'F'");
//        ResultSet rs = stmtListaC.executeQuery();
//        
//        List<Pedido> lista = new ArrayList();
//        while(rs.next()){
//            Pedido pedido = new Pedido(rs.getInt("idPedido"));
//            lista.add(pedido);
//        }
//        return lista;
//    }
    
    @Override
    public void finalize() throws Throwable{
        super.finalize();
        stmtInserir.close();
        stmtAlterar.close();
        stmtListar.close();
        stmtBuscar.close();
        stmtCancelar.close();
        stmtConsulta.close();
        stmtEfetivar.close();
        stmtListaC.close();
        stmtBuscarD.close();
        stmtMontaL.close();
        stmtAberto.close();
        stmtAtraso.close();
        stmtAbertoHoje.close();
        con.close();
    }
}
